﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Reporting.WinForms;

using Interfaces;
using Controller;

namespace GUI
{
    public partial class FrmSendEmail : Form
    {
        // attributter
        EmmaSystem system;
        ReportViewer rapport;       // et sted at gemme rapporten til senere brug
        string filPlacering = @"C:\SkarpSoftware\Rapport.pdf";      // placering og navn på den fil, der skal vedhæftes mailen

        // konstruktør
        public FrmSendEmail(EmmaSystem system, ReportViewer rapport)
        {
            InitializeComponent();
            this.system = system;
            this.rapport = rapport;
        }

        // form load hændelse
        private void FrmSendPosteringer_Load(object sender, EventArgs e)
        {
            Directory.CreateDirectory(@"C:\SkarpSoftware");     // opretter mappen, hvis den ikke findes
            
            cboUpdate();

            btnSend.Enabled = false;
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
            txtBesked.Text = "Hej ....... \r\n Vi fremsender hermed en oversigt over vores posteringer/årsregnskab/faktura. Filen er vedhæftet denne email.";
            txtEmne.Text = "Rapport fra Skarp Software I/S";

            try
            {
                OpbygFil();
            }
            catch (Exception ex)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Den vedhæftede fil kunne ikke oprettes.";
            }
        }

        // send knappen
        private void btnSend_Click(object sender, EventArgs e)
        {
            try
            {
                string besked = txtBesked.Text;
                string emne = txtEmne.Text;
                string modtager = txtModtager.Text;
                system.SendMail(modtager, emne, besked, filPlacering);

                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "E-mailen med den vedhæftede fil er sendt.";

                btnSend.Enabled = false;
                cboUpdate();
            }
            catch (Exception ex)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "E-mailen med den vedhæftede fil kunne ikke sendes.";
            }
        }

        // hjælpemetode til at opdatere comboboks med kundeliste
        public void cboUpdate()
        {
            cboKundeliste.Items.Clear();

            IKundedata iKunde;
            IEnumerator iKundeiterator = system.GetKunder();
            iKundeiterator.Reset();

            while (iKundeiterator.MoveNext())
            {
                iKunde = (IKundedata)iKundeiterator.Current;

                cboKundeliste.Items.Add(iKunde.Firmanavn);
            }
        }

        // tjek for hvornår programmet er klar til at sende mailen
        private void cboKundeliste_SelectedIndexChanged(object sender, EventArgs e)
        {
            IKundedata iKunde;
            IEnumerator iKundeiterator = system.GetKunder();
            iKundeiterator.Reset();

            while (iKundeiterator.MoveNext())
            {
                iKunde = (IKundedata)iKundeiterator.Current;

                if (iKunde.Firmanavn == cboKundeliste.SelectedItem.ToString())
                {
                    txtModtager.Text = iKunde.Email;
                }
            }
        }        

        // når der skrives i modtager feltet...
        private void txtModtager_TextChanged(object sender, EventArgs e)
        {
            tjekIndput();
        }

        // når der skrives i emne feltet...
        private void txtEmne_TextChanged(object sender, EventArgs e)
        {
            tjekIndput();
        }

        // når der skrives i besked feltet...
        private void txtBesked_TextChanged(object sender, EventArgs e)
        {
            tjekIndput();
        }
        
        // metode til at tjekke tekstfelternes input
        private void tjekIndput()
        {
            if (txtEmne.Text != "" && txtModtager.Text != "" && txtBesked.Text != "")
            {
                btnSend.Enabled = true;
            }
            else
            {
                btnSend.Enabled = false;
            }
        }

        // metode til at opbygge filen
        private void OpbygFil()
        {
            byte[] rapportIndhold = rapport.LocalReport.Render("PDF");
            /* LocalReport.Render("PDF") betyder at filen renderes (oversættes) til PDF-format 
               den renderede rapport sættes ind i et byte array (byte[] rapportIndhold) */
            FileStream fil = new FileStream(filPlacering, FileMode.Create);
            /* FileStream er en klasse, der giver adgang til filsystemet. I ovenstående statement skaber man en FileStream,
               der skaber filen og giver den en placering i filsystemet. */
            fil.Write(rapportIndhold, 0, rapportIndhold.Length);
            /* her skrives indholdet af rapporten og dens start indeks og slut indeks til den skabte fil */
            fil.Close();
        }

        // luk-knappen
        private void btnLuk_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
